/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Network;

import java.awt.event.ActionListener;
import java.io.Serializable;
import java.rmi.registry.Registry;
import java.util.Iterator;
import java.util.LinkedList;

/**
 * Сетевой адрес представляет собой пару <Хост, порт> сервера
 * Данная структура необходима для представления информации о подчинённом сервере на сервере арбитре
 * @author Volk ID = 1001
 */
public class NetworkAddress implements Comparable<NetworkAddress>, Serializable{

  //--------------------Аттрибуты класса--------------------------
  private String host; //хост
  private int port;    //порт
  private boolean state; //доступен ли сервер в текущий момент времени
  private long GUIDServer = 0;//уникальный идентификатор сервера

  //--------------------------------------------------------------

  //--------------------Пакетные методы---------------------------
  /**
   * Установить уникальный идентификатор сервера
   * @param guid уникальный идентификатор сервера
   */
  protected void setGUID(long guid){
   GUIDServer = guid;
  }
  /**
   * Установить имя хоста сервера
   * @param host - имя хоста
   */
  protected void setHost(String host){
   if(host == null) throw new NullPointerException();
   this.host = host;
  }

  /**
   * Установить номер порта сервера
   * @param port номер порта
   */
  protected void setPort(int port){
   this.port = port;
  }

  /**
   * Пометить узел как недоступный
   */
  protected void SetDisable(){state = false;}
  
  /**
   * Пометить узел как доступный
   */
  protected void SetEnable(){state = true;}

  //--------------------------------------------------------------


  //--------------------Интерфейсные методы-----------------------

  /**
   * Создать объект. По умолчанию значение хоста - localhost, а в качестве порта, указывается
   * порт по умолчанию используемый RMI.
   */
  public NetworkAddress(){
   host = "localhost";
   port = Registry.REGISTRY_PORT;
   state = true;
  }

  /**
   * Создать объект.
   * @param host - имя хоста сервера
   * @param port  - имя порта сервера
   */
  public NetworkAddress(String host, int port){
   setHost(host);
   setPort(port);
  }

  /**
   * Получить хост сервера
   * @return имя хоста сервера
   */
  public String getHost(){return host;}

  /**
   * Получить порт сервера
   * @return порт сервера
   */
  public int getPort(){return port;}

  /**
   * Получить идентификатор сервера
   * @return идентификатор сервера
   */
  public long getGUID(){
   return GUIDServer;
  }


  /**
   * Проверить узел на доступность
   * @return true - узел доступен, false - узел недоступен
   */
  public boolean isEnable(){return state;}

  //Организация сравнений двух объектов
  public int compareTo(NetworkAddress o) {
    String temp1 = host + port;
    String temp2 = o.host + o.port;
    if(temp1.hashCode() < temp2.hashCode()) return -1;
     else if(temp1.hashCode() == temp2.hashCode()) return 0;
      else return 1;
  }

 /**
  * Сравнение двух объектов на равенство
  * @param o второй операнд
  * @return true - равны, false - не равны
  */
  @Override
  public boolean equals(Object o){
   if(o instanceof NetworkAddress){
    NetworkAddress ad = (NetworkAddress)o;
    if(host.equals(ad.getHost()))
     if(port == ad.getPort()) return true;
    return false;
   }else return super.equals(o);
  }



  //--------------------------------------------------------------

  /**
   * Получение строки соответствующей объекту
   * @return строка
   * @author Алексей ID=2001
   */
  @Override
  public String toString(){
      return host+":"+port;
  }

  @Override
  public int hashCode(){
   return toString().hashCode();
  }
}
